package com.eksboot;

import org.apache.commons.lang3.StringUtils;
import org.springframework.util.StopWatch;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.stream.IntStream;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;

public class Zip {

    public static void main(String[] args) throws IOException {
        String src = "122222222222222222222222222dsdjelwe2013年11月25日下午，习近平总书记来到山东省临沭县曹庄镇朱村，观看这个抗战初期就建立党组织的支前模范村的村史展，了解革命老区群众生产生活。那天，王经臣为总书记讲解了朱村保卫战的场景。总书记了解到谷牧、肖华、铁瑛等老一辈无产阶级革命家在朱村战斗、工作的经历后表示，朱村的红色文化教育基地办得好，为子孙后代留下了宝贵精神财富。\n" +
                "“生活一天比一天好，但我们不能忘记历史，不能忘记那些为新中国诞生而浴血奋战的烈士英雄，不能忘记为革命作出重大贡献的老区人民。”在当时83岁的“老支前”王克昌家中，习近平总书记坐下来同一家人拉家常。总书记一连说了三个“不能忘记”，对老区人民的深厚感情溢于言表。\n" +
                "朱村地理位置优越，西倚岌山，村内河流纵横，玉带缠绕，是抗日战争时期有名的红色堡垒村、解放战争时期典型的支前模范村，是“枪声就是命令”的诞生地，被誉为滨海“小延安”。峥嵘岁月给朱村留下了大量珍贵的红色历史文化遗存，以及数不清的军民鱼水情深故事。\n" +
                "在朱村所在的沂蒙山水间，从1938年山东省委领导抗日武装起义开始到1949年解放战争胜利，十余年的革命斗争岁月里，发生过大大小小的战斗4000余次。在当时沂蒙根据地420万人口中，有120多万人拥军支前，20多万人参军参战，10多万英烈血染疆场。\n" +
                "沂蒙母亲王换于创办战时托儿所，抚养40多名革命长大抚养40多名革命后代长大成人；“沂蒙六姐妹”不分昼夜组织全村男女老少为部队做军衣，筹军粮，护理伤病员；李桂芳等32名妇女拆掉自家门板，跳入冰冷的河水，用柔弱的身躯架起“火线桥”……共产党人“敢教日月换新天”，人民就是力量之源。222222222222";
//        System.out.println("size: "+src.getBytes().length+" src: "+src);
//        String encode = new sun.misc.BASE64Encoder().encode(src.getBytes(StandardCharsets.UTF_8));
//        System.out.println("size: "+encode.getBytes().length+" encode: "+encode);
//        String decode = new String(new sun.misc.BASE64Decoder().decodeBuffer(encode), StandardCharsets.UTF_8);
//        System.out.println("size: "+decode.getBytes().length+" decode: "+decode);
        StopWatch watch = new StopWatch();
        IntStream.of(1, 10, 100, 1000, 10000, 100000, 1000000).forEach(count -> {
            watch.start("次数：" + count);
            IntStream.rangeClosed(1, count).forEach(c -> {
//                try {
//                    String encode = new sun.misc.BASE64Encoder().encode(src.getBytes(StandardCharsets.UTF_8));
//                    String decode = new String(new sun.misc.BASE64Decoder().decodeBuffer(encode), StandardCharsets.UTF_8);
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
                String encode = gzip(src + c);
                String decode = ungzip(encode);
            });
            watch.stop();
        });
        for (StopWatch.TaskInfo taskInfo : watch.getTaskInfo()){
            System.out.println(StringUtils.rightPad(taskInfo.getTaskName(), 20) + taskInfo.getTimeMillis());
        }

    }


    /**
     * 使用gzip进行压缩
     */
    public static String gzip(String primStr) {
        if (primStr == null || primStr.length() == 0) {
            return primStr;
        }

        ByteArrayOutputStream out = new ByteArrayOutputStream();

        GZIPOutputStream gzip = null;
        try {
            gzip = new GZIPOutputStream(out);
            gzip.write(primStr.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (gzip != null) {
                try {
                    gzip.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }


        return new sun.misc.BASE64Encoder().encode(out.toByteArray());
    }

    /**
     * <p>Description:使用gzip进行解压缩</p>
     *
     * @param compressedStr
     * @return
     */
    public static String ungzip(String compressedStr) {
        if (compressedStr == null) {
            return null;
        }

        ByteArrayOutputStream out = new ByteArrayOutputStream();
        ByteArrayInputStream in = null;
        GZIPInputStream ginzip = null;
        byte[] compressed = null;
        String decompressed = null;
        try {
            compressed = new sun.misc.BASE64Decoder().decodeBuffer(compressedStr);
            in = new ByteArrayInputStream(compressed);
            ginzip = new GZIPInputStream(in);

            byte[] buffer = new byte[1024];
            int offset = -1;
            while ((offset = ginzip.read(buffer)) != -1) {
                out.write(buffer, 0, offset);
            }
            decompressed = out.toString();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ginzip != null) {
                try {
                    ginzip.close();
                } catch (IOException e) {
                }
            }
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                }
            }
            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                }
            }
        }

        return decompressed;
    }
}
